#pragma once

#ifndef __HWINFORM_H__
#define __HWINFORM_H__

#include "hwindef.h"
#include "hwinmessage.h"
#include "hwinclass.h"
#include "hwincontainercontrol.h"

namespace harlinn
{
    namespace windows
    {

        class Menu;
        class MenuBar;
        // --------------------------------------------------------------------
        // Form
        // --------------------------------------------------------------------
        class MenuBar;
        class Form : public ContainerControl
        {
            bool shown;
            std::shared_ptr<MenuBar> menuBar;
        private:
            
        public:
            typedef ContainerControl Base;

            HWIN_EXPORT Form( );
        protected:
            HWIN_EXPORT virtual std::shared_ptr<WindowClass> GetWindowClass() const;
        public:
            HWIN_EXPORT virtual DWORD GetStyle() const;

            HWIN_EXPORT virtual void HandleMessage(Message& message);

            HWIN_EXPORT Form& Close();

            HWIN_EXPORT Form& DrawMenuBar();

            HWIN_EXPORT std::shared_ptr<MenuBar> GetMenu() const;
            HWIN_EXPORT Form& SetMenu(std::shared_ptr<MenuBar> theMenu);

            HWIN_EXPORT Form& GetMenuBarInfo(LONG idObject,LONG idItem,PMENUBARINFO pmbi);
            HWIN_EXPORT Form& GetMenuBarInfo(LONG idObject,LONG idItem,MENUBARINFO& pmbi);
            HWIN_EXPORT MENUBARINFO GetMenuBarInfo(LONG idObject,LONG idItem);

            boost::signals2::signal<void (Form* theForm,Message& message)> OnActivate;
            boost::signals2::signal<void (Form* theForm,Message& message)> OnActivateApp;
            boost::signals2::signal<void (Form* theForm,Message& message)> OnDevModeChange;
            boost::signals2::signal<void (Form* theForm,Message& message)> OnEndSession;
            boost::signals2::signal<void (Form* theForm,Message& message)> OnFontChange;
            boost::signals2::signal<void (Form* theForm,Message& message)> OnGetMinMaxInfo;
            boost::signals2::signal<void (Form* theForm,Message& message)> OnIconEraseBackground;
            boost::signals2::signal<void (Form* theForm,Message& message)> OnMouseActivate;
            boost::signals2::signal<void (Form* theForm,Message& message)> OnPaintIcon;
            boost::signals2::signal<void (Form* theForm,Message& message)> OnPowerBroadcast;
            boost::signals2::signal<void (Form* theForm,Message& message)> OnQueryDragIcon;
            boost::signals2::signal<void (Form* theForm,Message& message)> OnQueryEndSession;
            boost::signals2::signal<void (Form* theForm,Message& message)> OnQueryOpen;
            boost::signals2::signal<void (Form* theForm,Message& message)> OnSettingChange;
            boost::signals2::signal<void (Form* theForm)> OnShown;
            boost::signals2::signal<void (Form* theForm,Message& message)> OnTimeChange;
        protected:
            HWIN_EXPORT virtual void DoOnHandleCreated( );


            HWIN_EXPORT virtual void DoOnActivate(Message& message);
            HWIN_EXPORT virtual void DoOnActivateApp(Message& message);
            HWIN_EXPORT virtual void DoOnDevModeChange(Message& message);
            HWIN_EXPORT virtual void DoOnEndSession(Message& message);
            HWIN_EXPORT virtual void DoOnFontChange(Message& message);
            HWIN_EXPORT virtual void DoOnGetMinMaxInfo(Message& message);
            HWIN_EXPORT virtual void DoOnIconEraseBackground(Message& message);
            HWIN_EXPORT virtual void DoOnMouseActivate(Message& message);
            HWIN_EXPORT virtual void DoOnPaintIcon(Message& message);
            HWIN_EXPORT virtual void DoOnPowerBroadcast(Message& message);
            HWIN_EXPORT virtual void DoOnQueryDragIcon(Message& message);
            HWIN_EXPORT virtual void DoOnQueryEndSession(Message& message);
            HWIN_EXPORT virtual void DoOnQueryOpen(Message& message);
            HWIN_EXPORT virtual void DoOnSettingChange(Message& message);
            HWIN_EXPORT virtual void DoOnShown();
            HWIN_EXPORT virtual void DoOnShowWindow(Message& message);
            HWIN_EXPORT virtual void DoOnTimeChange(Message& message);


        };



    }
}
#endif // __HWINFORM_H__